#include "SeqList.h"
//打印顺序表的内容
void PrintChar(SeqList *seq,const char *msg)
{
    if(seq==NULL)
    {//参数错误
        return;
    }
    printf("\n%s\n",msg);
    printf("size:%lu\n",seq->size);
    size_t i=0;
    for(i=0;i<seq->size;i++)
    {
        printf("[%c] ",seq->data[i]);
    }
    printf("\n");
}
//顺序表的初始化
void SeqListInit(SeqList *seq)
{
    if(seq==NULL)
    {//参数错误
        return;
    }
    seq->size=0;
}
//顺序表的尾部插入
void SeqListPushBack(SeqList *seq,SeqListType value)
{
    if(seq==NULL)
    {//参数错误
        return;
    }
    if(seq->size>=SeqListSize)
    {//顺序表已经满了
        return;
    }
    seq->data[seq->size]=value;
    seq->size++;
}
//顺序表的尾部删除
void SeqListPopBack(SeqList *seq)
{
    if(seq==NULL)
    {//参数错误
        return;
    }
    if(seq->size==0)
    {//顺序表为空
        return;
    }
    seq->size--;
}
//顺序表的头部插入
void SeqListPushFront(SeqList *seq,SeqListType value)
{
    if(seq==NULL)
    {//参数错误
        return;
    }
    if(seq->size>=SeqListSize)
    {//顺序表已满
        return;
    }
    size_t i=0;
    for(i=seq->size;i>0;i--)
    {
        seq->data[i]=seq->data[i-1];
    }
    seq->data[0]=value;
    seq->size++;
}
//顺序表的头部删除‘
void SeqListPopFront(SeqList *seq)
{
    if(seq==NULL)
    {//参数错误
        return;
    }
    if(seq->size<=0)
    {//顺序表已经空
        return;
    }
    size_t i=0;
    for(i=0;i<seq->size-1;i++)
    {
        seq->data[i]=seq->data[i+1];
    }
    seq->size--;
}
//获取顺序表中任意位置元素
int SeqListGet(SeqList *seq,size_t pos,SeqListType *tmp)
{
    if(seq==NULL||tmp==NULL)
    {//参数错误
        return 0;
    }
    if(seq->size==0)
    {//顺序表为空
        return 0;
    }
    if(pos>=seq->size)
    {//所给的位置错误
        return 0;
    }
    *tmp=seq->data[pos];
    return 1;
}
//将顺序表中任意位置的值进行设置
void SeqListSet(SeqList *seq,size_t pos,SeqListType value)
{
    if(seq==NULL)
    {//参数错误
        return;
    }
    if(pos>=seq->size)
    {//所给位置超出范围
        return;
    }
    seq->data[pos]=value;
}
//查找顺序表中指定元素的下标
size_t SeqListFind(SeqList *seq,SeqListType value)
{
    if(seq==NULL)
    {//参数错误
        return (size_t)-1;
    }
    size_t i=0;
    for(i=0;i<seq->size;i++)
    {
        if(seq->data[i]==value)
        {
            return i;
        }
    }
    //出循环说明没有找到所给元素
    return (size_t)-1;
}
//在指定位置进行插入元素
void Swap(SeqListType *a,SeqListType *b)
{
    SeqListType tmp=*a;
    *a=*b;
    *b=tmp;
}
void SeqListInsert(SeqList *seq,size_t pos,SeqListType value)
{
    if(seq==NULL)
    {//参数错误
        return;
    }
    if(pos>=seq->size)
    {//所给位置错误
        return;
    }
    //先进行尾部插入
    //在进行pos和尾部元素交换
    seq->data[seq->size]=value;
    Swap(&seq->data[pos],&seq->data[seq->size]);
    seq->size++;
    //下面是传统方法
   // size_t i=0;
   // for(i=seq->size;i>pos;i--)
   // {
   //     seq->data[i]=seq->data[i-1];
   // }
   // seq->data[pos]=value;
   // seq->size++;
}
//删除指定位置的值
void SeqListErase(SeqList *seq,size_t pos)
{
    if(seq==NULL)
    {//参数错误
        return;
    }
    if(pos>=seq->size)
    {//所给位置错误
        return;
    }
    seq->data[pos]=seq->data[seq->size-1];
    seq->size--;
    //以下是传统方法
    //size_t i=0;
    //for(i=pos;i<seq->size-1;i++)
    //{
    //    seq->data[i]=seq->data[i+1];
    //}
    //seq->size--;
}
//删除表中指定的值
void SeqListRemove(SeqList *seq,SeqListType value)
{
    if(seq==NULL)
    {//参数错误
        return;
    }
    size_t find_size=SeqListFind(seq,value);
    if(find_size==(size_t)-1)
    {//没有找到要删除的值
        return;
    }
    else
    {
        SeqListErase(seq,find_size);
    }
    //以下是传统方法
    size_t i=0;
    size_t find_index=0;
    for(i=0;i<seq->size;i++)
    {
        if(seq->data[i]==value)
        {
            break;
        }
    }
    if(i==seq->size)
    {//说明没有找到
        return;
    }
    else
    {
        find_index=i;
        for(i=find_index;i<seq->size-1;i++)
        {
            seq->data[i]=seq->data[i+1];
        }
        seq->size--;
    }
}
//删除顺序表中所有指定的值
void SeqListRemoveAll(SeqList *seq,SeqListType value)
{
    if(seq==NULL)
    {//参数错误
        return;
    }
    size_t count=seq->size;
    size_t find=0;
    while(count)
    {
        size_t i=0;
        for(i=find;i<seq->size;i++)
        {
            if(seq->data[i]==value)
            {
                SeqListErase(seq,i);
                break;
            }
        }
        find=i;
        count--;
    }
}
//获取顺序表中元素个数
size_t SeqListGetSize(SeqList *seq)
{
    if(seq==NULL)
    {//参数错误
        return (size_t)-1;
    }
    return seq->size;
}
//判断顺序表是否为空
int SeqListEmpty(SeqList *seq)
{
    if(seq==NULL)
    {//参数错误
        return 0;
    }
    return seq->size==0;
}
//对顺序表中的值进行冒泡排序
void SeqListBubbleSort(SeqList *seq)
{
    if(seq==NULL)
    {//参数错误
        return;
    }
    size_t count=0;
    size_t i=0;
    for(count=0;count<seq->size;count++)
    {
        for(i=0;i<seq->size-count-1;i++)
        {
            if(seq->data[i]>seq->data[i+1])
            {
                Swap(&seq->data[i],&seq->data[i+1]);
            }
        }
    }
}
